package lib;

public class TriDenombrement extends Tri {

	public TriDenombrement(int nb) {
		super(nb);
		
	}

		
	
	public  int Max() {
	    int maximum = this.getElement(0);   
	    for (int i=0; i<this.getT().length-1; i++) {
	        if (this.getElement(i) > maximum) {
	            maximum = this.getElement(i);  
	        }
	    }
	    return maximum;
	}
	
	@Override
	public void tri()
	{
		int s[] = new int[this.getT().length+1];
		
		
		int k=this.getT().length;
		
		if(k<this.Max()){	 
			k=this.Max();
		}
		
		
		int aux[]= new int [k] ;
		
		
		for(int i=0;i<k;i++)
		{
			aux[i]=0;
		}
		/************************************************************************************************
		 * 										Premi�re assertion										*
		 ************************************************************************************************/		
		for(int c = 0; c<aux.length ;++c)
		{
		
			assert aux[c]<=1 : "Erreur : Assertion non respect�e tableau non tri� jusqu'� "+c ;
			
		}
		/***********************************************************************************************/
		
		for(int j=0;j<this.getT().length;j++)
		{
			
			aux[this.getElement(j)]=aux[this.getElement(j)]+1;
		}
		
		/************************************************************************************************
		 * 										Deuxieme assertion										*
		 ************************************************************************************************/		
		int cpt=0;
		
		for(int i = 0; i<this.getT().length ;++i)
		{
			
			for(int j = 0; j<aux.length ;++j)
			{
				if(aux[j] == this.getElement(i))
				{
					cpt++;
			
				}
				assert this.getElement(i) == j : "Erreur : indice de  Element du tableau t non respect�";
			}
			
			assert cpt == aux[this.getElement(i)] : "Erreur: nombre occurence non respect�e"; 
		}
		/***********************************************************************************************/
		
		for(int i=1;i<k;i++)
		{
			aux[i]=aux[i]+aux[i-1];
		}

		/************************************************************************************************
		 * 										Troisieme assertion										*
		 ************************************************************************************************/		
		
		for(int i = 1; i<this.getT().length;i++){
			assert this.getElement(aux[i]) == this.getElement(i): "Les indices ne correspondent pas ";
		}
		
		/***********************************************************************************************/
		
		for(int j=this.getT().length-1;j >= 0;j--)

		{
			s[aux[this.getElement(j)]]=this.getElement(j);
			
			aux[this.getElement(j)]=aux[this.getElement(j)]-1;
			
			/************************************************************************************************
			 * 										Quatrieme assertion										*
			 ************************************************************************************************/	
			
			for(int x  = 1 ; x< j; ++x)
			{
				assert s[x]>s[x-1] : "Le tableau n'est pas trié";
			}
			
			/***********************************************************************************************/
		}
		this.setT(s);
		
		/************************************************************************************************
		 * 										Cinquieme assertion										*
		 ************************************************************************************************/		
		
		for(int x  = 1 ; x< s.length; ++x)
		{
			assert s[x]>s[x-1] : "Le tableau n'est pas trié";
		}
		/***********************************************************************************************/
	}
}
